/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.servinf.ani.comparator;

import com.servinf.ani.mapper.AssignmentMapper;
import com.servinf.ani.sincronizador.App;
import com.servinf.ani.sincronizador.entities.Proyecto;
import com.servinf.ani.sincronizador.entities.TramoVia;
import com.servinf.ani.sincronizador.exception.IncompatibleTypesException;
import com.servinf.ani.sincronizador.service.LaneService;
import com.servinf.ani.sincronizador.service.ProjectService;
import com.servinf.ani.sincronizador.utils.LogHelper;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.persistence.NoResultException;

/**
 *
 * @author David
 */
public class LaneComparator {
    
    /**
     * Método que compara la lista de tramos leida de la base de datos y cada uno de los tramos del Map<String, String>
     * donde la llave el el nombre del tramo y el valor es el ide del proyecto en porject online.
     */
    public static void compareList(Map<String, String> lanesInExcel, List<TramoVia> jpaList) throws IOException {
        LogHelper.Log(LogHelper.INFO, "Inicia sincronización de tramos Excel vs BD", null);
        LaneService laneService = (LaneService) App.getContext().getBean("laneService");
        ProjectService projectService = (ProjectService) App.getContext().getBean("projectService");
        //Se itera sobre las llaves del Map
        Iterator<Entry<String, String>> itr = lanesInExcel.entrySet().iterator();
        while(itr.hasNext()) {
            Entry<String, String> entry = itr.next();
            String laneName = entry.getKey(); //Nombre leido de excel
            String projectId = entry.getValue();
            boolean found = false;
            for(TramoVia lane : jpaList) {
                if(laneName.trim().equals(lane.getNombre().trim())) {
                    
                    //Por ahora no se actualizan tramos porque la información de la tabla de BD requiere información que no está en
                    //El excel, excepto el nombre ysaber a que proyecto pertenece.
                    
//                  LogHelper.Log(LogHelper.INFO, "ACTUALIZANDO el tramo " + lane.toString(), null);
//                  try {
//                           //projectService.update(excelList.get(i), project);
//                  } catch (IncompatibleTypesException ex) {
//                      LogHelper.Log(LogHelper.ERROR, "Existen datos en la información del excel que no corresponden con el tipo de dato", ex);
//                  }
                    found = true;
                    break;
                }
            }
            if(found) {
                    continue;
            }else {
                try {
                    LogHelper.Log(LogHelper.INFO, "CREANDO el tramo " + laneName, null);
                    Proyecto project = projectService.findByProjectOnlineId(projectId);
                    if(project != null) {
                        TramoVia lane = new TramoVia();
                        lane.setCodigoVia(App.maxId);
                        lane.setNombre(laneName);
                        lane.setIdProyecto(project);
                        laneService.create(lane);
                        App.maxId++;
                    }else {
                        LogHelper.Log(LogHelper.ERROR, "No se puede asociar tramo a proyecto, No existe un proyecto con el id " + projectId + " para el tramo " + laneName, null);
                    }
                } catch (IncompatibleTypesException ex) {
                      LogHelper.Log(LogHelper.ERROR, "Existen datos en la información del excel que no corresponden con el tipo de dato", ex);
                } catch (NoResultException ner) {
                      LogHelper.Log(LogHelper.ERROR, "No se puede asociar tramo a proyecto, No existe un proyecto con el id " + projectId + " para el tramo " + laneName, null);
                }
            }
        }
    }
    
    /**
     * Mediante la comparación de ids de dos entidades (Excel vs DB) se determina si existe o si es un registro 
     * nuevo que debe crearse.
     * @param excelEntity Entidad leida desde excel
     * @param jpaEntity Entidad leida desde la base de datos.
     * @return 
     */
    public static boolean isEntityInDB(List<Object> excelEntity, TramoVia jpaEntity)  {
        
        String laneJPAName = jpaEntity.getNombre(); //Nombre del tramo vía en base de datos.
        String excelLaneName = (String) excelEntity.get(AssignmentMapper.Tramo_T);
        boolean found = laneJPAName.trim().equals(excelLaneName.trim());
        return found;
        
    }

    private static boolean validateLaneNullable(List<Object> row) {
       
            return true;
       
    }
    
}
